package com.huxi.lang.validation.predicate;

/**
 * 强类型条件
 * 
 * @since 1.0
 * @version 1.0
 * @author jian.wu
 *
 * @param <T>
 */
public interface TypedPredicate<T> extends VPredicate {

	/**
	 * 强类型条件判断
	 * 
	 * @param value 参数值，非空。
	 * @return 参数值满足条件则返回{@code true}，否则返回{@code false}
	 * @throws NullPointerException 参数值为空
	 */
	boolean typedTest(T value);

	/**
	 * 条件操作期望类型
	 * 
	 * @return 类型
	 */
	default Class<T> expected() {
		return null;
	}

	/**
	 * 条件操作可支持的类型
	 * 
	 * @param type 类型，非空。
	 * @return 操作支持参数类型则返回{@code true}，否则返回{@code false}
	 */
	default boolean supported(Class<?> type) {
		if (type == null || expected() == null) {
			return false;
		}
		return expected().isAssignableFrom(type);
	}
}
